package co.gov.medellin.ssti.sub.model.dao.impl;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import oracle.jdbc.OracleTypes;
import co.gov.medellin.ssti.sub.common.util.FiltrosReportesUtil;
import co.gov.medellin.ssti.sub.common.util.Utility;
import co.gov.medellin.ssti.sub.model.dao.IReporteTotalGrupoFamiliarDAO;
import co.gov.medellin.ssti.sub.model.dao.exception.DAOException;
import co.gov.medellin.ssti.sub.model.vo.CondicionConsultaVO;
import co.gov.medellin.ssti.sub.model.vo.ReporteGrupoFamiliarVO;
import co.gov.medellin.ssti.sub.model.vo.ReporteTotalGrupoFamiliarVO;
import co.gov.medellin.ssti.sub.model.vo.SubprogramaVO;

public class ReporteTotalGrupoFamiliarDAOImpl extends BaseDAOImpl implements
		IReporteTotalGrupoFamiliarDAO {

	public ReporteTotalGrupoFamiliarDAOImpl(Connection con) {
		super(con);
	}

	public Collection<ReporteTotalGrupoFamiliarVO> findReportGrupoFamiliar(
			ReporteGrupoFamiliarVO criteria, List<CondicionConsultaVO> lFilters)
			throws DAOException {
		CallableStatement cs = null;
		ResultSet rst = null;

		List<Object> filterParameters = new ArrayList<Object>();
		StringBuffer filtros = new StringBuffer(" ");

		if (lFilters != null && lFilters.size() != 0) {
			CondicionConsultaVO condConsVO = new CondicionConsultaVO();
			for (int i = 0; i < lFilters.size(); i++) {
				condConsVO = (CondicionConsultaVO) lFilters.get(i);
				// se valida que no vengan codCampo o filtros invalidos para
				// evitar sql injection.
				if (!Utility.isCodCampoGFValido(condConsVO.getCodcampo())) {
					throw new DAOException("Codigo campo invalido.");
				}
				if (!Utility.isCodFiltroValido(condConsVO.getCodFiltro())) {
					throw new DAOException("Codigo de filtro invalido.");
				}

				if (condConsVO.getCodFiltro().equals(Utility.ENTRE)) {
					// AND COLUMNA BETWEEN ? AND ?
					filtros.append(" AND " + condConsVO.getCodcampo() + " "
							+ condConsVO.getCodFiltro() + " ? AND ? ");
					filterParameters.add(condConsVO.getValor());
					filterParameters.add(condConsVO.getValor2());
				}
				// AND COLUMNA LIKE '%?%'
				else if (condConsVO.getCodFiltro().equals(Utility.PARECIDO)) {
					filtros.append(" AND " + condConsVO.getCodcampo() + " "
							+ condConsVO.getCodFiltro() + " ? ");
					filterParameters.add("%" + condConsVO.getValor() + "%");
				} else {
					if (!condConsVO.getCodcampo().equals(
							Utility.NUMERO_BENEFICIOS)) {
						// AND UPPER(COLUMNA) OPERADOR ?
						filtros.append(" AND UPPER(" + condConsVO.getCodcampo()
								+ " ) " + condConsVO.getCodFiltro() + " ? ");
						filterParameters.add(condConsVO.getValor()
								.toUpperCase());
					} else {
						if (condConsVO.getCodFiltro().equals(Utility.ENTRE)) {
							filtros.append("AND NUMERO_BENEFICIOS BETWEEN ? AND ? ");
							filterParameters.add(condConsVO.getValor());
							filterParameters.add(condConsVO.getValor2());
						} else {
							filtros.append("AND NUMERO_BENEFICIOS"
									+ condConsVO.getCodFiltro() + " ? ");
							filterParameters.add(condConsVO.getValor());
						}
					}
				}
			}
		}

		String desde = null;
		String hasta = null;
		if (criteria.getDesde() != null && !criteria.getDesde().isEmpty()) {
			desde = criteria.getDesde();
		}
		if (criteria.getDesde() != null && !criteria.getDesde().isEmpty()) {
			hasta = criteria.getHasta();
		}

		String strSql = "{call beneficios.PCS_REPORTE_GRUPO_FAMILIAR(?, ?, ?, ?, ?, ?, ?, "
				+ "'" + filtros.toString() + "'" + ", ?)}";

		System.out.println("strSql: " + strSql);

		String strAnterior = "";
		int iCount = 0;
		ArrayList<ReporteTotalGrupoFamiliarVO> lResults = new ArrayList<ReporteTotalGrupoFamiliarVO>();
		try {
			cs = conn.prepareCall(strSql);

			if (criteria.getCodeComuna() == null) {
				cs.setNull(1, OracleTypes.NULL);
			} else {
				cs.setLong(1, criteria.getCodeComuna());
			}
			if (criteria.getCodeZona() == null) {
				cs.setNull(2, OracleTypes.NULL);
			} else {
				cs.setLong(2, criteria.getCodeZona());
			}
			if (criteria.getCodeBarrio() == null) {
				cs.setNull(3, OracleTypes.NULL);
			} else {
				cs.setLong(3, criteria.getCodeBarrio());
			}
			if (criteria.getCodeSubprograma() == null) {
				cs.setNull(4, OracleTypes.NULL);
			} else {
				cs.setLong(4, criteria.getCodeSubprograma());
			}
			if (criteria.getCodePrograma() == null) {
				cs.setNull(5, OracleTypes.NULL);
			} else {
				cs.setLong(5, criteria.getCodePrograma());
			}
			cs.setString(6, desde);
			cs.setString(7, hasta);
			// cs.setString(8, filtros.toString());
			// obtener el numero de parametros del cs (o el indice en donde debe
			// insertarse el siguiente parametro).
			int index = cs.getParameterMetaData().getParameterCount();
			System.out.println("index: " + index);
			System.out.println(criteria.getCodeComuna());
			System.out.println(criteria.getCodeZona());
			System.out.println(criteria.getCodeBarrio());
			System.out.println(criteria.getCodeSubprograma());
			System.out.println(criteria.getCodePrograma());
			System.out.println(desde);
			System.out.println(hasta);
			for (int i = 0; i < filterParameters.size(); i++) {
				index += 1;
				System.out.println("i " + i);
				cs.setString(index, (String) filterParameters.get(i));
			}
			// index += 1;
			cs.registerOutParameter(index, OracleTypes.CURSOR);
			cs.execute();
			rst = (ResultSet) cs.getObject(index);

			while (rst.next()) {
				ReporteTotalGrupoFamiliarVO repGFVO = new ReporteTotalGrupoFamiliarVO();
				repGFVO.setNombreGrupoFamiliar(rst.getString("NAME_GRUPOFAM"));
				repGFVO.setCodeGrupoFamiliar(rst.getString("CODE_GRUPOFAM"));
				repGFVO.setNombreJefeHogar(rst.getString("NAME1_BENE") + " "
						+ rst.getString("NAME2_BENE") + " "
						+ rst.getString("APE1_BENE") + " "
						+ rst.getString("APE2_BENE"));
				repGFVO.setCodeJefeHogar(rst.getString("CODE_BENE"));
				repGFVO.setParentesco(rst.getString("PARENTESCO"));
				repGFVO.setNombreComuna(rst.getString("NAME_COMUNA"));
				repGFVO.setNombreZona(rst.getString("NAME_ZONA"));
				repGFVO.setNombreBarrio(rst.getString("NAME_BARRIO"));
				repGFVO.setNumeroBeneficios(rst.getString("NUMERO_BENEFICIOS"));
				repGFVO.setNumeroMiembros(rst.getString("NUMERO_MIEMBROS"));
				if (!strAnterior.equals(rst.getString("NAME_GRUPOFAM"))) {
					iCount += 1;
					strAnterior = rst.getString("NAME_GRUPOFAM");
					lResults.add(repGFVO);
				}
			}
			if (iCount > 0) {
				ReporteTotalGrupoFamiliarVO repGFVO = new ReporteTotalGrupoFamiliarVO();
				repGFVO.setNombreGrupoFamiliar("TOTAL GRUPO FAMILIAR");
				lResults.add(repGFVO);

				repGFVO = new ReporteTotalGrupoFamiliarVO();
				repGFVO.setNombreGrupoFamiliar(String.valueOf(iCount));
				lResults.add(repGFVO);
			}
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(rst, cs);
		}
		return lResults;
	}

	public Collection<ReporteTotalGrupoFamiliarVO> findIndividualReport(
			Long codeGF) throws DAOException {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		String query = "SELECT DISTINCT BENEGF.GF_CODIGO CodeGrupoFam, GRUPOFAM.NOMBRE NomGrupoFam, BENEGF.BEN_CODIGO CodeBene, "
				+ " BENE.PRIMER_NOMBRE Nom1Bene, NVL(BENE.SEGUNDO_NOMBRE,' ') Nom2Bene, BENE.PRIMER_APELLIDO Ape1Bene, "
				+ " NVL(BENE.SEGUNDO_APELLIDO,' ') Ape2Bene, VFLEXPAREN.NOMBRE Parentesco, BENEOTOR.SBPR_CODIGO CodeSubpro, "
				+ " SUB.NOMBRE NomSub, PRO.CODIGO CodeProg, PRO.NOMBRE NomProg "
				+ " FROM TCS_BEN_BENEF_GRUPO_FAMILIAR BENEGF, TCS_BEN_BENEFICIO_OTORGADO BENEOTOR, TCS_BEN_SUBPROGRAMA SUB, "
				+ " TCS_BEN_GRUPO_FAMILIAR GRUPOFAM, TCS_BEN_BENEFICIARIO BENE, PAOYER.TCS_VALOR_FLEXIBLE VFLEXPAREN, "
				+ " TCS_BEN_PROGRAMA PRO "
				+ " WHERE BENEOTOR.BEN_CODIGO (+)= BENEGF.BEN_CODIGO "
				+ " AND SUB.CODIGO (+)= BENEOTOR.SBPR_CODIGO "
				+ " AND PRO.CODIGO (+)= SUB.PRG_CODIGO "
				+ " AND BENEGF.GF_CODIGO = GRUPOFAM.CODIGO "
				+ " AND BENEGF.BEN_CODIGO = BENE.CODIGO "
				+ " AND BENEGF.VFL_CODIGO_PARENTESCO = VFLEXPAREN.CODIGO "
				+ " AND BENEGF.GF_CODIGO = ? ";

		ArrayList<ReporteTotalGrupoFamiliarVO> lResults = new ArrayList<ReporteTotalGrupoFamiliarVO>();
		try {
			pstmt = conn.prepareStatement(query);
			pstmt.setLong(1, codeGF.longValue());
			rst = pstmt.executeQuery();

			ReporteTotalGrupoFamiliarVO objReportVO = null;
			while (rst.next()) {
				objReportVO = new ReporteTotalGrupoFamiliarVO();
				objReportVO
						.setNombreGrupoFamiliar(rst.getString("NomGrupoFam"));
				objReportVO.setCodeGrupoFamiliar(rst.getString("CodeGrupoFam"));
				objReportVO.setNombreJefeHogar(rst.getString("Nom1Bene") + " "
						+ rst.getString("Nom2Bene") + " "
						+ rst.getString("Ape1Bene") + " "
						+ rst.getString("Ape2Bene"));
				objReportVO.setCodeJefeHogar(rst.getString("CodeBene"));
				objReportVO.setParentesco(rst.getString("Parentesco"));
				objReportVO.setNombrePrograma(rst.getString("NomProg"));
				objReportVO.setNombreSubprograma(rst.getString("NomSub"));

				lResults.add(objReportVO);
				objReportVO = null;
			}
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(rst, pstmt);
		}
		return lResults;
	}

	public Collection<ReporteTotalGrupoFamiliarVO> findTotalReportGrupoFamiliar(
			ReporteGrupoFamiliarVO criteria, List<CondicionConsultaVO> lFilters)
			throws DAOException {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		List<Object> parameters = new ArrayList<Object>();
		StringBuffer query = new StringBuffer(
				"SELECT DISTINCT CODE_GRUPOFAM, NAME_GRUPOFAM, CODE_BENE, "
						+ "NAME1_BENE, NAME2_BENE, APE1_BENE, APE2_BENE, "
						+ "TIPO_DOCUMENTO, NUMERO_DOCUMENTO, CODE_BARRIO, "
						+ "CODE_COMUNA, CODE_ZONA, PARENTESCO, CODE_SUBPRO, "
						+ "NAME_SUB, CODE_PROG, NAME_PROG, NAME_BARRIO, "
						+ "NAME_ZONA, NAME_COMUNA, NUMERO_BENEFICIOS, NUMERO_MIEMBROS "
						+ "FROM BENEFICIOS.VMCS_BENE_REPORTGFCRITERIA "
						+ "WHERE 1=1 ");

		String strAnterior = "";
		int iCount = 0;

		if ((Object) criteria.getCodeComuna() != null) {
			query.append(" AND CODE_COMUNA = ? ");
			parameters.add(criteria.getCodeComuna());
		}
		if ((Object) criteria.getCodeZona() != null) {
			query.append(" AND CODE_ZONA = ? ");
			parameters.add(criteria.getCodeZona());
		}
		if ((Object) criteria.getCodeBarrio() != null) {
			query.append(" AND CODE_BARRIO = ? ");
			parameters.add(criteria.getCodeBarrio());
		}

		if ((Object) criteria.getCodeSubprograma() != null) {
			query.append(" AND CODE_SUBPRO = ? ");
			parameters.add(criteria.getCodeSubprograma());
		}
		if ((Object) criteria.getCodesSubprogramas() != null) {
			query.append(" AND CODE_SUBPRO IN (");
			String[] subprogramas = criteria.getCodesSubprogramas().split(",");
			for (int i = 0; i < subprogramas.length; i++) {
				query.append("?");
				parameters.add(subprogramas[i]);
				if (i < subprogramas.length - 1) {
					query.append(", ");
				}
			}
			query.append(") ");

		}
		if ((Object) criteria.getCodePrograma() != null) {
			query.append(" AND CODE_PROG = ? ");
			parameters.add(criteria.getCodePrograma());
		}
		if ((Object) criteria.getCodesProgramas() != null) {
			query.append(" AND CODE_PROG IN (?) ");
			parameters.add(criteria.getCodesProgramas());
		}

		if ((Object) criteria.getDesde() != null
				&& (Object) criteria.getHasta() != null) {
			query.append("AND FECHA_BENEFICIO BETWEEN ? AND ? ");
			parameters.add(criteria.getDesde());
			parameters.add(criteria.getHasta());
		}
		if ((Object) criteria.getDesde() != null
				&& (Object) criteria.getHasta() == null) {
			query.append("AND FECHA_BENEFICIO >= ? ");
			parameters.add(criteria.getDesde());
		}
		if ((Object) criteria.getDesde() == null
				&& (Object) criteria.getHasta() != null) {
			query.append("AND FECHA_BENEFICIO <= ? ");
			parameters.add(criteria.getHasta());
		}

		if (lFilters != null && lFilters.size() != 0) {
			CondicionConsultaVO objCondConsVO = new CondicionConsultaVO();
			for (int i = 0; i < lFilters.size(); i++) {
				objCondConsVO = (CondicionConsultaVO) lFilters.get(i);
				// Validar codCampo.
				try {
					if (!isCodCampoValido(objCondConsVO.getCodcampo(),
							"VMCS_BENE_REPORTGFCRITERIA")) {
						throw new DAOException("Campo incorrecto: ");
					}
				} catch (SQLException e) {
					throw new DAOException(
							"Error al intentar validar el campo: "
									+ objCondConsVO.getCodcampo());
				}
				/*
				 * if (!Utility.isCodCampoGFValido(objCondConsVO.getCodcampo()))
				 * { throw new DAOException("Codigo campo invalido."); }
				 */
				if (!Utility.isCodFiltroValido(objCondConsVO.getCodFiltro())) {
					throw new DAOException("Codigo de filtro invalido.");
				}
				if (objCondConsVO.getCodFiltro().equals(Utility.ENTRE)) {
					query.append(" AND " + objCondConsVO.getCodcampo()
							+ " BETWEEN ? AND ? ");
					parameters.add(objCondConsVO.getValor());
					parameters.add(objCondConsVO.getValor2());

				} else if (objCondConsVO.getFiltro().equalsIgnoreCase(
						Utility.PARECIDO)) {
					query.append(" AND ");
					query.append(objCondConsVO.getCodcampo());
					query.append(" ");
					query.append(FiltrosReportesUtil.PARECIDO);
					query.append(" ? ");
					parameters.add("%" + objCondConsVO.getValor() + "%");
				} else {
					if (!objCondConsVO.getCodcampo().equals(
							Utility.NUMERO_BENEFICIOS)) {
						query.append(" AND UPPER("
								+ objCondConsVO.getCodcampo() + ") "
								+ objCondConsVO.getCodFiltro() + " ? ");
						parameters.add(objCondConsVO.getValor().toUpperCase());

					} else {
						if (objCondConsVO.getFiltro().equals(Utility.ENTRE)) {
							query.append(" AND NUMERO_BENEFICIOS BETWEEN ? AND ? ");
							parameters.add(objCondConsVO.getValor());
							parameters.add(objCondConsVO.getValor2());
						} else {
							query.append(" AND NUMERO_BENEFICIOS "
									+ objCondConsVO.getCodFiltro() + " ? ");
							parameters.add(objCondConsVO.getValor());
						}
					}
				}
			}
		}
		query.append(" ORDER BY NAME_GRUPOFAM");

		ArrayList<ReporteTotalGrupoFamiliarVO> lResults = new ArrayList<ReporteTotalGrupoFamiliarVO>();
		try {
			pstmt = conn.prepareStatement(query.toString());
			pstmt = setQueryParameters(pstmt, parameters);
			rst = pstmt.executeQuery();
			ReporteTotalGrupoFamiliarVO objReportVO = null;
			while (rst.next()) {
				objReportVO = new ReporteTotalGrupoFamiliarVO();
				objReportVO.setNombreGrupoFamiliar(rst
						.getString("NAME_GRUPOFAM"));
				objReportVO
						.setCodeGrupoFamiliar(rst.getString("CODE_GRUPOFAM"));
				objReportVO.setNombreJefeHogar(rst.getString("NAME1_BENE")
						+ " " + rst.getString("NAME2_BENE") + " "
						+ rst.getString("APE1_BENE") + " "
						+ rst.getString("APE2_BENE"));
				objReportVO.setCodeJefeHogar(rst.getString("CODE_BENE"));
				objReportVO.setParentesco(rst.getString("PARENTESCO"));
				objReportVO.setNombreComuna(rst.getString("NAME_COMUNA"));
				objReportVO.setNombreZona(rst.getString("NAME_ZONA"));
				objReportVO.setNombreBarrio(rst.getString("NAME_BARRIO"));
				objReportVO.setNombreSubprograma(rst.getString("NAME_SUB"));
				objReportVO.setNombrePrograma(rst.getString("NAME_PROG"));
				objReportVO.setNumeroBeneficios(rst
						.getString("NUMERO_BENEFICIOS"));
				objReportVO.setNumeroMiembros(rst.getString("NUMERO_MIEMBROS"));

				lResults.add(objReportVO);
				if (!strAnterior.equals(rst.getString("NAME_GRUPOFAM"))) {
					iCount += 1;
					strAnterior = rst.getString("NAME_GRUPOFAM");
				}
				objReportVO = null;
			}
			if (iCount > 0) {
				objReportVO = new ReporteTotalGrupoFamiliarVO();
				objReportVO.setNombreGrupoFamiliar("TOTAL GRUPO FAMILIAR");
				lResults.add(objReportVO);

				objReportVO = new ReporteTotalGrupoFamiliarVO();
				objReportVO.setNombreGrupoFamiliar(String.valueOf(iCount));
				lResults.add(objReportVO);
			}
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(rst, pstmt);
		}
		return lResults;
	}

	public Collection<SubprogramaVO> findProgSubprog(Long codeUser,
			String userGroupName, Long codeArea) throws DAOException {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		String query = "SELECT DISTINCT pro.CODIGO codprog,pro.NOMBRE nompro,subpro.codigo codeSubprograma, "
				+ " UPPER(subpro.nombre) nomSubprograma, usu.codigo codeusu, subpro.usu_codigo adminbene, pro.usu_codigo adminpro "
				+ " FROM TCS_BEN_SUBPROGRAMA subpro, "
				+ " TCS_BEN_PROGRAMA pro, "
				+ " TCS_BEN_SUBPROGRAMA_USUARIO subus, "
				+ " paoyer.tcs_usuario usu "
				+ " WHERE pro.codigo = subpro.PRG_CODIGO "
				+ " AND (subpro.CODIGO = subus.SBPR_CODIGO OR 'ADMINISTRADOR GENERAL' = ? "
				+ " OR 'SUPER USUARIO' = ? OR subpro.usu_codigo = ? "
				+ " OR pro.usu_codigo = ? "
				+ " ) "
				+ " AND subus.USU_CODIGO = usu.CODIGO "
				+ " AND usu.CODIGO = ? " + " ORDER BY nompro";

		ArrayList<SubprogramaVO> subprogramas = new ArrayList<SubprogramaVO>();
		try {
			pstmt = conn.prepareStatement(query);
			pstmt.setString(1, userGroupName);
			pstmt.setString(2, userGroupName);
			pstmt.setLong(3, codeUser.longValue());
			pstmt.setLong(4, codeUser.longValue());
			pstmt.setLong(5, codeUser.longValue());
			rst = pstmt.executeQuery();
			SubprogramaVO subpro = null;
			while (rst.next()) {
				subpro = new SubprogramaVO();
				subpro.setCodeSubPrograma(rst.getString("codeSubprograma"));
				subpro.setNombre(rst.getString("nomSubprograma"));
				subpro.setNombrePrograma(rst.getString("nompro"));
				subpro.setCodePrograma(new Long(rst.getString("codprog")));
				subprogramas.add(subpro);
				subpro = null;
			}
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(rst, pstmt);
		}
		return subprogramas;
	}

	public ReporteGrupoFamiliarVO findFilters(ReporteGrupoFamiliarVO repGFVO)
			throws DAOException {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		List<Object> parameters = new ArrayList<Object>();
		StringBuffer strQuery = new StringBuffer();
		if ((repGFVO.getCodePrograma() != null)
				&& (repGFVO.getCodePrograma() != new Long(0))) {
			strQuery.append("SELECT PROG.NOMBRE NOMBRE_PROGRAMA, SUB.NOMBRE NOMBRE_SUBPROGRAMA"
					+ " FROM TCS_BEN_PROGRAMA PROG, TCS_BEN_SUBPROGRAMA SUB"
					+ " WHERE PROG.CODIGO = SUB.PRG_CODIGO"
					+ " AND PROG.CODIGO = ? ");
			parameters.add(repGFVO.getCodePrograma());

			if ((repGFVO.getCodeSubprograma() != null)
					&& (repGFVO.getCodePrograma() != new Long(0))) {
				strQuery.append(" AND SUB.CODIGO = ? ");
				parameters.add(repGFVO.getCodeSubprograma());
			}

			try {
				pstmt = conn.prepareStatement(strQuery.toString());
				pstmt = setQueryParameters(pstmt, parameters);
				rst = pstmt.executeQuery();
				if (rst.next()) {
					if (repGFVO.getCodeSubprograma() != null)
						repGFVO.setNombreSubprograma(rst
								.getString("NOMBRE_SUBPROGRAMA"));
					repGFVO.setNombrePrograma(rst.getString("NOMBRE_PROGRAMA"));
				}
			} catch (SQLException e) {
				throw new DAOException(e);
			} finally {
				close(rst, pstmt);
			}
		}
		if (repGFVO.getCodeZona() != null || repGFVO.getCodeComuna() != null
				|| repGFVO.getCodeBarrio() != null) {
			strQuery.setLength(0);
			strQuery.append("SELECT VF.NOMBRE, TV.NOMBRE N "
					+ " FROM PAOYER.TCS_TIPO_VALOR_FLEX TV, PAOYER.TCS_VALOR_FLEXIBLE VF "
					+ " WHERE TV.CODIGO = VF.TVF_CODIGO "
					+ " AND VF.CODIGO IN (?, ?, ?) ORDER BY N");
			try {
				pstmt = conn.prepareStatement(strQuery.toString());
				pstmt.setLong(1, repGFVO.getCodeZona().longValue());
				pstmt.setLong(2, repGFVO.getCodeComuna().longValue());
				pstmt.setLong(3, repGFVO.getCodeBarrio().longValue());
				rst = pstmt.executeQuery();

				if (repGFVO.getCodeBarrio() != null) {
					if (rst.next()) {
						repGFVO.setNombreBarrio(rst.getString("NOMBRE"));
					}
				}
				if (repGFVO.getCodeComuna() != null) {
					if (rst.next()) {
						repGFVO.setNombreComuna(rst.getString("NOMBRE"));
					}
				}
				if (repGFVO.getCodeZona() != null) {
					if (rst.next()) {
						repGFVO.setNombreZona(rst.getString("NOMBRE"));
					}
				}
			} catch (SQLException e) {
				throw new DAOException(e);
			} finally {
				close(rst, pstmt);
			}
		}
		return repGFVO;
	}

	private boolean isCodCampoValido(String codCampo, String nombreTabla)
			throws SQLException {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		String query = "SELECT COLUMN_NAME FROM user_tab_columns WHERE table_name = ? ";
		try {
			pstmt = conn.prepareStatement(query);
			pstmt.setString(1, nombreTabla);
			rst = pstmt.executeQuery();
			while (rst.next()) {
				if (codCampo.equalsIgnoreCase(rst.getString("COLUMN_NAME"))) {
					return true;
				}
			}
		} finally {
			close(rst, pstmt);
		}
		return false;
	}
}
